#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/12/15 22:50
# @Author  : 唐松
# @File    : logger_util.py
# @Software: PyCharm

import logging
import os
import threading
import time
import colorlog
from concurrent_log_handler import ConcurrentRotatingFileHandler

from configs.setting import get_object_path


class HandleLogs:
    def __init__(self):
        # 初始化HandleLogs类, 创建一个logger实例
        self.logger = logging.getLogger(__name__)
        # 设置logger的日志级别为DEBUG
        self.logger.setLevel(logging.DEBUG)
        # 配置logger
        self._configure_logger()

    def _configure_logger(self):
        # 检查logger是否已经有处理器（避免重复添加处理器）
        if not self.logger.handlers:
            # 获取当前日期并格式化为“Log.年-月-日”的字符串
            current_date = "Log." + time.strftime('%Y-%m-%d')
            # 构造日志文件路径
            logs_path = os.path.join(get_object_path(), 'logs', current_date)
            # 创建日志文件夹（如果不存在）
            os.makedirs(logs_path, exist_ok=True)
            # 创建日志文件名, 格式为'test.年月日.log'
            logfile_name = os.path.join(logs_path, f'test.{time.strftime("%Y%m%d")}.{threading.get_ident()}.log')

            # 定义控制台日志的颜色配置
            log_color_config = {
                'DEBUG': 'cyan',  # DEBUG级别的日志为青色
                'INFO': 'green',  # INFO级别的日志为绿色
                'ERROR': 'red',  # ERROR级别的日志为红色
                'WARNING': 'yellow',  # WARNING级别的日志为黄色
                'CRITICAL': 'red'  # CRITICAL级别的日志为红色
            }
            # 定义控制台日志格式, 包括日志颜色
            steam_format = colorlog.ColoredFormatter(
                '%(log_color)s %(levelname)s - %(asctime)s - %(filename)s:%(lineno)d -[%(module)s:%(funcName)s] - '
                '%(message)s',
                log_colors=log_color_config)

            # 创建控制台日志处理器
            sh = logging.StreamHandler()
            # 设置控制台日志处理器的日志级别为DEBUG
            sh.setLevel(logging.DEBUG)
            # 设置控制台日志处理器的日志格式
            sh.setFormatter(steam_format)
            # 将控制台日志处理器添加到logger
            self.logger.addHandler(sh)

            # 定义文件日志格式
            log_format = logging.Formatter(
                '%(levelname)s - %(asctime)s - %(filename)s:%(lineno)d -[%(module)s:%(funcName)s] - %(message)s')

            # 创建按时间轮转的文件日志处理器
            fh = ConcurrentRotatingFileHandler(filename=logfile_name, mode='a', maxBytes=5242880, backupCount=1,
                                               encoding='utf-8')
            fh.setLevel(logging.DEBUG)
            # 设置文件日志处理器的日志格式
            fh.setFormatter(log_format)
            # 将文件日志处理器添加到logger
            self.logger.addHandler(fh)

    def get_logger(self):
        # 返回logger实例
        return self.logger


# 创建HandleLogs类的实例
handle = HandleLogs()
# 获取logger实例
logs = handle.get_logger()

# logs.info('这是info的日志信息')
# logs.error('这是error的日志信息')
# logs.debug('这是debug的日志信息')
# logs.warning('这是warning的日志信息')
# logs.critical('这是critical的日志信息')
